package com.mijie.homi.search.util;

import java.io.IOException;

import java.util.BitSet;

import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;

import org.apache.lucene.index.AtomicReaderContext;

import org.apache.lucene.index.DocsEnum;

import org.apache.lucene.index.Term;

import org.apache.lucene.search.DocIdSet;

import org.apache.lucene.search.Filter;

import org.apache.lucene.util.AttributeSource;

import org.apache.lucene.util.Bits;

import org.apache.lucene.util.DocIdBitSet;

import org.apache.lucene.util.FixedBitSet;

import org.apache.lucene.util.OpenBitSet;

/***
 * 
 *^_^ ^_^ ^_^
 * 
 * QQ交流探讨群:324714439
 * 
 * 自定义过滤器
 * 
 * @author 三劫小编
 * 
 * */

public class MyCustomFilter extends Filter {

	public MyCustomFilter() {

		// TODO Auto-generated constructor stub

	}

	private String[] terms;// 限制返回的数据字典

	public MyCustomFilter(String... terms) {

		// TODO Auto-generated constructor stub

		this.terms = terms;

	}

	@Override
	public DocIdSet getDocIdSet(AtomicReaderContext arg0, Bits arg1)

	throws IOException {
//arg0.reader().maxDoc() 50000
		FixedBitSet bits = new FixedBitSet(arg0.reader().maxDoc());// 获取没有所有的docid包括未删除的

		int base = arg0.docBase;// 段的相对基数，保证多个段时相对位置正确

		// int limit=base+arg0.reader().maxDoc();//计算最大限制值

		for (String s : terms) {

			DocsEnum doc = arg0.reader().termDocsEnum(new Term("id", s));// 必须是唯一的不重复

			// 保证是单个不重复的term,如果重复的话，默认会取第一个作为返回结果集,分词后的term也不适用自定义term

			if (doc.nextDoc() != -1) {

				bits.set(doc.docID());// 对付符合条件约束的docid循环添加到bits里面

			}

		}

		return bits;

	}

}